package com.huangyi;

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();

        // 测试用例1：包含正负数
        int[] nums1 = {2, 3, -2, 4};
        System.out.println("测试用例1: [2,3,-2,4]");
        System.out.println("最大乘积: " + solution.maxProduct(nums1)); // 预期输出: 6

        // 测试用例2：全是负数
        int[] nums2 = {-2, 0, -1};
        System.out.println("\n测试用例2: [-2,0,-1]");
        System.out.println("最大乘积: " + solution.maxProduct(nums2)); // 预期输出: 0

        // 测试用例3：包含0
        int[] nums3 = {-2, 3, -4};
        System.out.println("\n测试用例3: [-2,3,-4]");
        System.out.println("最大乘积: " + solution.maxProduct(nums3)); // 预期输出: 24

        // 测试用例4：单个元素
        int[] nums4 = {-2};
        System.out.println("\n测试用例4: [-2]");
        System.out.println("最大乘积: " + solution.maxProduct(nums4)); // 预期输出: -2
    }

    // 乘积最大的子数组
    static class Solution {
        public int maxProduct(int[] nums) {
            int n = nums.length;
            // max[i] 表示以第 i 个元素结尾的子数组最大乘积
            // min[i] 表示以第 i 个元素结尾的子数组最小乘积（用于处理负数）
            long[] max = new long[n + 1];
            long[] min = new long[n + 1];
            max[0] = min[0] = 1;
            long result = Integer.MIN_VALUE;

            for (int i = 1; i <= n; i++) {
                // 当前元素、当前元素×最大值、当前元素×最小值，三者取最大
                max[i] = Math.max(nums[i - 1], Math.max(nums[i - 1] * max[i - 1], nums[i - 1] * min[i - 1]));
                // 当前元素、当前元素×最大值、当前元素×最小值，三者取最小
                min[i] = Math.min(nums[i - 1], Math.min(nums[i - 1] * max[i - 1], nums[i - 1] * min[i - 1]));
                result = Math.max(result, max[i]);
            }

            return (int) result;
        }
    }
}